# -*- coding: utf-8 -*-
'''
	路由参数
    pip install python-multipart
'''
import uvicorn
from fastapi import FastAPI, Path, Query, Form, Form, Header, Cookie, UploadFile
from typing_extensions import Annotated
from enum import Enum
from typing import Union, Optional
from decimal import Decimal
from pydantic import BaseModel

class Gender(str, Enum):
    male   = "male"
    female = "female"

app = FastAPI()

###########################################################################
### 路径参数
@app.get("/index/{id}", tags=['Path参数'])
def test1(id:int=Path()):
    return "接收到路径参数：%d" % id
    
@app.get("/test/{name}", tags=['Path参数'])
def test2(name:str=Path( min_length=6, title="标题", description="描述", pattern=r'\d+' )):
    return "接收到路径参数：%s" % name

@app.get("/people/{gender}", tags=['Path参数'])
async def test3(gender: Gender):
    return "枚举类型路径参数：%s" % gender

###########################################################################
### 查询参数
@app.get("/search", tags=['Query参数'])
def search(page:int=Query(default=0), limit:int=Query(default=10)):
    return "起始页：%d，每页记录数：%d" % (page, limit)

def empty_to_none(v: str) -> Optional[str]:
    if v == '':
        return None
    return v

    
class EmptyStrToNone(str):
    @classmethod
    def __get_validators__(cls):
        yield empty_to_none
        
@app.get("/items", tags=['Query参数'])
def items( q:Union[int, None] = None,  name: Union[str, None] = None ):
    
    return q


###########################################################################
### 表单数据
@app.post("/p1", tags=['Form参数'])
def items( p:int=Form() ):
    
    return p


###########################################################################
### 请求体参数

class Item(BaseModel):
    name: str
    description: Union[str, None] = None
    price: float
    tax: Union[float, None] = None
    
@app.post("/pitems/")
async def post_item(item: Item):
    return item



###########################################################################
### Header参数
@app.get("/user_agent")
async def read_items(user_agent: Annotated[Union[str, None], Header()] = None):
    return {"User-Agent": user_agent}

###########################################################################
### Cookie
@app.get("/cookie")
async def read_cookie( serverType: Annotated[Union[str, None], Cookie()] = None ):
    return {"cookie": serverType}

###########################################################################
### 文件
@app.get("/upload")
async def read_cookie( file: UploadFile ):
    return {"filename": file.filename}


if __name__ == '__main__':

    uvicorn.run(
        app     = 'example06-路由参数:app', 
        host    = "0.0.0.0", 
        port    = 8080, 
        reload  = True
    )